import React from 'react'

export default function index() {
    /**
     * 简单数据类型去重
     * 法一： new Set()
     * 法二：reduce()
     */
    // const arr = [1, 1, 2, 3, 5, 5, 'w', 'w', 'x', 'x', 'x', 'y']
    // // console.log(Array.from(new Set(arr)))
    // let resArr = arr.reduce((pre, cur,index) => {
    //     if(!pre.includes(cur)){
    //         pre.push(cur)
    //     }
    //     return pre
    // }, [])
    // console.log('resArr', resArr)

    /**
     * 判断两个数组是否相同：长度等&&值等（此处不考虑元素顺序）
     * 逻辑：
     * 1.数组长度是否相等——》不等返回false
     * 2.数组值是否相等
     */

    const arr1 = ['a', 1, 'b', 2]
    const arr2 = [1, 2, 'a', 'b']

    function arraysIsEqual(arr1, arr2) {
        if (arr1.length !== arr2.length) return false

        for (let i = 0; i < arr1.length; i++) {
            if (arr2.indexOf(arr1[i]) === -1) {
                return false
            }
        }
        return true
        // arr1.forEach(item => {
        //     console.log('item', item,'arr2.indexOf(item) === -1',arr2.indexOf(item) === -1)
        //   if(arr2.indexOf(item) === -1){
        //     return false
        //   }
        //     break
        // })

    }
    // console.log(arraysIsEqual(arr1, arr2))


    /**
     * 判断两个object是否相同：长度等&&key等&&值等
     * 逻辑：
     * 1.长度是否相等——》不等返回false
     * 2.key值是否相等
     * 3.相同key下value是否相等
     */

    const obj1 = { name: 'wxy', sex: 'female' }
    const obj2 = { name: 'wxy' }
    const obj3 = { name: 'xy' }
    const obj4 = { name: 'xy', sex: 'male' }
    const obj5 = { age: '18' }
    const obj6 = { name: 'wxy', sex: 'female' }

    function objIsEqual(obj1, obj2) {
        const keys1 = Object.keys(obj1)
        const keys2 = Object.keys(obj2)
        if (keys1.length !== keys2.length) return false

        // key是否相等
        if (arraysIsEqual(keys1, keys2)) {
            // 同一key下value是否相等
            for (let i = 0; i < keys1.length; i++) {
                if (obj2[i] !== obj1[i]) {
                    return false
                }
            }
            return true
        } else {
            return false
        }
    }

    function objIsEqual2(obj1, obj2) {
        const keys1 = Object.keys(obj1)
        const keys2 = Object.keys(obj2)
        if (keys1.length !== keys2.length) return false

        for(let key of keys1){
            // key不同或者同key不同值
            if (!keys2.includes(key) || obj1[key] !== obj2[key]){
                return false
            }
            // key同
            // if(keys2.includes(key)){
            //     // 同key下value相同
            //     if(obj1[key] !== obj2[key]){
            //         return false
            //     }
            // }else return false
        }
        return true

    }
    // console.log(objIsEqual2(obj1, obj4))



    /**
     * 数组数据结构去重
     * 
     * 1.第一项：直接放入pre数组中
     * 2.第二项及以后项：与pre中的每一项比较，不同即返回false
     * 
     */
    const arrObj = [
        { name: 'wxy' },
        { name: 'xy' },
        { name: 'wxy', sex: 'female' },
        { name: 'wxy', sex: 'female' },
        { name: 'wxy' },
        { name: 'wxy', sex: 'female', age: 18 }
    ]
    
    let Mymap = new Map()
    let resArr = arrObj.reduce((pre,cur,index)=>{
        // console.log('pre',pre,'cur',cur,'index',index)

        // 方法一
        /**
         * 1.第一项：直接放入pre数组中
         * 2.第二项及以后项：与pre中的每一项比较，不同即返回false
         */
        // if(index === 0){
        //     pre.push(cur)
        // }else{
        //     const len = pre.length
        //     let flag = false // 是否将cur放入pre中
        //     for(let item of pre){
        //         // pre中项 与cur是否相同判断
        //         if (objIsEqual2(item, cur)) {
        //             flag = true
        //         }
        //     }
        //     // pre中每一项都与cur不同
        //     if(!flag){
        //         pre.push(cur)
        //     }



        // }
        // return pre

        // 方法二
        /**
         * every:如果pre是空时，返回true
         */
        // if (pre.every(item => !objIsEqual2(item, cur))) {
        //     pre.push(cur)
        // }
        // return pre


        // 方法三
        /**
         * 1.可以取一个唯一标识 
         * 2.然后去已存在数组或对象或map里通过这个唯一标识拿值，
         * 如果能拿到，说明已经存在了，
         * 拿不到就可以把当前数据放进已存在数组或对象或map里
         * 
         */
        const arrKeys = Object.keys(cur).sort()
        const strKey = arrKeys.reduce((kpre, kcur) => {
            kpre += `${kcur}${cur[kcur]}`
            return kpre
        }, '')

        if (!Mymap.get(strKey)) {
            pre.push(cur)
            Mymap.set(strKey, true)
        }
        return pre
    },[])

    console.log('resArr', resArr)


    return (
        <>
            <h1>HELLO XIAOYU!</h1>
        </>
    )
}